package ec.edu.ucacue.siop.procesoNegocio.iniciar.variables;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;

import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesAlimentacionDAO;
import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesAlimentacionDAOImpl;
import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesProcesoDAO;
import ec.edu.ucacue.siop.dao.historico.HistoriaVariablesProcesoDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.VariableAlimentacionDAO;
import ec.edu.ucacue.siop.dao.recurso.VariableAlimentacionDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.VariableProcesoDAO;
import ec.edu.ucacue.siop.dao.recurso.VariableProcesoDAOImpl;
import ec.edu.ucacue.siop.modelo.operacion.historico.HistoriaVariablesAlimentacion;
import ec.edu.ucacue.siop.modelo.operacion.historico.HistoriaVariablesProceso;
import ec.edu.ucacue.siop.modelo.recurso.VariableAlimentacion;
import ec.edu.ucacue.siop.modelo.recurso.VariableProceso;
import ec.edu.ucacue.siop.proceso.calculoBorrar.Cont24horas;
import ec.edu.ucacue.siop.proceso.iniciar.aplicacion.ContVarAlimProd;
import ec.edu.ucacue.siop.proceso.iniciar.aplicacion.ContVarProceso;
import ec.edu.ucacue.siop.proceso.iniciar.lectores.ContenedorRelacion;
import ec.edu.ucacue.siop.proceso.iniciar.lectores.LectorExcelHorno;
import ec.edu.ucacue.siop.proceso.iniciar.lectores.LectorTablaRelacionVar;
import ec.edu.ucacue.siop.utilidades.HibernateUtil;


public class CargaVarMesHorno {
	private String error;

	public String getError() {
		return error;
	}

	public void setError(String error) {
		this.error = error;
	}
	
	public boolean cargar(String nomDirectorio, String a_o) {
		
		File directorio = new File(nomDirectorio);
		FileWriter result;
		try {
			result = new FileWriter("error.txt",true);
			BufferedWriter bw = new BufferedWriter(result);
			PrintWriter wr = new PrintWriter(bw);
			if(!directorio.isDirectory()) {
				error = "No existe el directorio " + nomDirectorio;
				wr.println(error);
				return false;
			}
			if(directorio.list().length == 0){
				error =" El directorio "+nomDirectorio + " esta vacio";
				wr.println(error);
				return false;
			}
			String[] listaDir = directorio.list();
			
			ordenar(listaDir);
			if(!listaDir[0].contentEquals("0relacion.xls")) {
				error = "El archivo de relacion no esta en el directorio";
				wr.println(error);
				return false;
			}
			LectorTablaRelacionVar lectorTabRel = new LectorTablaRelacionVar();
			if(!lectorTabRel.leer(nomDirectorio+"/0relacion.xls")){
				error = "En directorio " + nomDirectorio + " " +lectorTabRel.getError();
				wr.println(error);
				return false;
			}
			List< ContenedorRelacion> listaRelaciones = lectorTabRel.getListaRelaciones();
			
			Session ses = HibernateUtil.beginTransaction();
			HistoriaVariablesProcesoDAO hisDAOPr = new HistoriaVariablesProcesoDAOImpl();
			HistoriaVariablesAlimentacionDAO hisDAOAl = new HistoriaVariablesAlimentacionDAOImpl();
			List<VariableAlimentacion> listaVarAlim = new ArrayList<VariableAlimentacion>();
			VariableAlimentacionDAO varAlDao = new VariableAlimentacionDAOImpl();
			List<VariableProceso> listaVarPro = new ArrayList<VariableProceso>();
			VariableProcesoDAO varProDAO = new VariableProcesoDAOImpl();
			for(int i=0; i<listaRelaciones.size(); i++){
				if(listaRelaciones.get(i).getTipoVar()==0) {
					VariableAlimentacion varAl = varAlDao.findByID(VariableAlimentacion.class, listaRelaciones.get(i).getIdVar());
					listaVarAlim.add(varAl);
					
				}
				else {
					VariableProceso varPro = varProDAO.findByID(VariableProceso.class, listaRelaciones.get(i).getIdVar());
					listaVarPro.add(varPro);
				}
			}
			
			
			for(int iDia=1; iDia<listaDir.length; iDia++) {
				LectorExcelHorno lector = new LectorExcelHorno();
				String nomArchivo = nomDirectorio+"/"+listaDir[iDia];
				if(!lector.leer(nomArchivo, lectorTabRel.getFilInicio(), lectorTabRel.getFilFinal(),a_o)){
					error = "En archivo " + nomArchivo +" " +lector.getError();
					wr.println(error);
					HibernateUtil.commitTransaction();
					HibernateUtil.closeSession();
					return true;
				}
				// Carga de los datos 
				List<Cont24horas> listaValores = lector.getListaVarDiaria();
				int indAl=0;
				int indPr=0;
				for(int i=0; i<listaValores.size(); i++){
					if(listaRelaciones.get(i).getTipoVar()==0) {
						for(int j=0; j<listaValores.get(i).getContenido().size();j++){
							HistoriaVariablesAlimentacion hisAl = hisDAOAl.create(listaVarAlim.get(indAl), 
									listaValores.get(i).getContenido().get(j).getValor(), 
									listaValores.get(i).getContenido().get(j).getFecha());
							ses.saveOrUpdate(hisAl);
							
						}
						indAl++;
					}
					else {
						
						for(int j=0; j<listaValores.get(i).getContenido().size();j++){
							HistoriaVariablesProceso hisPro = hisDAOPr.create(listaVarPro.get(indPr), 
									listaValores.get(i).getContenido().get(j).getValor(), 
									listaValores.get(i).getContenido().get(j).getFecha());
							ses.saveOrUpdate(hisPro);
	
						}
						indPr++;
						
					}
				}
			}
			wr.close();
			bw.close();
			result.close();
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
		
	}

	private void ordenar(String[] listadoArchivos) {
		for(int i=0; i<listadoArchivos.length-1;i++) {
			
			for(int j=i+1; j<listadoArchivos.length; j++) {
				if(listadoArchivos[i].compareTo(listadoArchivos[j]) > 0) {
					String aux = listadoArchivos[i];
					listadoArchivos[i] = listadoArchivos[j];
					listadoArchivos[j] = aux;
				}
			}
		}
		
	}

}
